package com.thread.threadfirst.studyThread4;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 12、ThreadPoolExecutor
 * 其实大多数（除了ForkJoinPool不是以外其他都是）线程池的实现 调用的都是ThreadPoolExecutor类，这就是ThreadPool线程池的一个通用类，如果以上的ThreadPool线程池都不想用 比如非要规定60秒钟之后才销毁线程 我就不想这样设定，此时就可以用它来自定义一个ThreadPool线程池。
 * <p>
 * corePoolSize：线程池中的起始线程个数。
 * maximumPoolSize：线程池中的最大线程个数。
 * keepAliveTime：线程池中的线程空闲时间，即线程在多长空闲时间后销毁。值为0L代表没有期限 线程将永远不会销毁。
 * unit：空闲时间的单位。
 * BlockingQueue<Runnable> workQueue：装任务的容器 注意：都是装Runnable任务的BlockingQueue阻塞容器。主要有4种BlockingQueue可选择 无界队列、有界队列、同步移交和DelayedWorkQueue。
 * threadFactory：线程工厂。
 * RejectedExecutionHandler handler：当线程数量达到最大时且工作队列满了之后采取的策略：一般来讲有 终止、抛弃、抛弃最旧的、调用者运行。
 */
public class T_ThreadPoolExecutor {
    public static void main(String[] args) {
        //拒绝策略：AbortPolicy 抛出RejectedExecutionException异常
        //LinkedBlockingQueue<Runnable>(5)设置了queue的容量是否就是有界的LinkedBlockingQueue？？？
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(5), new ThreadPoolExecutor.DiscardPolicy());  //RejectedExecutionHandler这里显然是个对象
        for (int i = 0; i < 100; i++) {
            executor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + " is running");
            });
        }
        executor.shutdown();
    }


}
